#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
////////////////////////////////////////////// 非阻塞等待 /////////////////////////////////////////////////
int main()
{
     pid_t id = fork();

     if(id == 0) //子进程
     {
          int n = 3;
          while(1)
          {
              printf("子进程...,pid:%d ppid:%d\n", getpid(), getppid());
              sleep(1);
              n--;
          }
          exit(5);
      }
      //sleep(5);
        
    while(1) //父进程
    {
        int status = 0;
        pid_t id = waitpid(id, &status, WNOHANG);
        if(id > 0) //子进程退出
        {
            printf("等待成功，子进程退出，exit code：%d，exit sigal:%d\n", WEXITSTATUS(status), status&0x7F);
            break;
        }
        else if(id == 0) //子进程未退出
        {
            printf("一次调用结束，子进程未退出\n");
            sleep(3);
        }
        else //等待失败
        {
            printf("等待失败\n");
            break;
        }
    }

    return 0;
}


///////////////////////////////////////////////////// 阻塞等待 //////////////////////////////////////////////////
//int main()
//{
//     pid_t id = fork();
//    
//     //正常程序
//    //if(id == 0)
//    //{
//    //    int n = 3;
//    //    while(n)
//    //    {
//    //        printf("子进程...,pid:%d ppid:%d\n", getpid(), getppid());
//    //        sleep(1);
//    //        n--;
//    //    }
//    //    exit(5);
//    //}
//    //sleep(5);
//    
//     //非正常程序
//    if(id == 0)
//    {
//        while(1)
//        {
//            sleep(3);
//            printf("子进程...,pid:%d ppid:%d\n", getpid(), getppid());
//            sleep(1);
//            //int *p = 0;
//            //*p = 100;
//            int a = 10;
//            a /= 0;
//        }
//        exit(10);
//    }
//    sleep(5);
//
//    
//    //pid_t rid = wait(NULL);
//    //pid_t rid = waitpid(id, NULL, 0); 
//    //pid_t rid = waitpid(345678, NULL, 0); //等待失败
//    
//    int status = 0;
//    pid_t rid = waitpid(id, &status, 0);
//
//    if(rid > 0)
//    {
//        //printf("wait success, rid:%d\n", rid);
//        //printf("wait success, rid:%d, status:%d\n", rid, status);
//        //printf("wait success, rid:%d, exit code:%d\n", rid, (status>>8)&0xFF);
//        //printf("wait success, rid:%d, exit code:%d, exit signal:%d\n", rid, (status>>8)&0xFF, status&0x7F);
//        //printf("wait success, rid:%d, exit code:%d, exit signal:%d\n", rid, WEXITSTATUS(status), status&0x7F);
//        //////////////////////////////////////////////////////////////////////////////////////////////////////////
//        if(WIFEXITED(status))
//        {
//            printf("wait success, rid:%d, exit code:%d, exit signal:%d\n", rid, WEXITSTATUS(status), status&0x7F);
//        }
//        else
//        {
//            printf("子进程退出异常\n");
//        }
//    }
//    else
//    {
//        printf("wait failed:%d->%s\n", errno, strerror(errno));
//    }
//    sleep(5);
//
//    return 0;
//}





/////////////////////////////////////////////////////////////////////////////////////////////
//void func()
//{
//    printf("Begin...\n");
//    exit(4);
//    printf("End...\n");
//}
//
//int main()
//{
//   // func();
//   
//    printf("Main()");
//    sleep(2);
//    _exit(23);
//    //printf("Main()\n");
//    //sleep(2);
//    //_exit(23);
//
//    //exit(23);
//
//    //int a = 10;
//    //a /= 0;
//    //int i = 0;
//    //for(; i < 140; i++)
//    //{
//    //    printf("%d-> %s\n", i, strerror(i));
//    //}
//
//    //////printf("hello!\n");
//    ////
//    //FILE* fp = fopen("log.txt", "r");
//    //if(fp == NULL)
//    //{
//    //    //return 1;
//    //    return errno;
//    //}
//    //fclose(fp);
//    return 0;
//}
